package com.special.threademo.thread;

import java.util.concurrent.CountDownLatch;

/**
 * @author liuYC
 * @ClassName CountDownDemo
 * @Description TODO
 * @date 2021/4/26 11:20
 *
 * 注意countdown和countbarrier的区呗：
 * CyclicBarrier的某个线程运行到某个点上之后，该线程即停止运行，直到所有的线程都到达了这个点，所有线程才重新运行；
 * CountDownLatch则不是，某线程运行到某个点上之后，只是给某个数值-1而已，该线程继续运行
 *
 * （2）CyclicBarrier只能唤起一个任务，CountDownLatch可以唤起多个任务
 * （3）CyclicBarrier可重用，CountDownLatch不可重用，计数值为0该CountDownLatch就不可再用了
 *
 * 作者：Larry
 * 链接：https://zhuanlan.zhihu.com/p/26441926
 * 来源：知乎
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 */
public class CountDownDemo {
    public static void main(String[] args) {
        final CountDownLatch countDownLatch = new CountDownLatch(5);
        System.out.println("现在6点下班了.....");
        // 3y线程启动
        new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    // 这⾥调⽤的是await()不是wait()
                    countDownLatch.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("...其他的5个员⼯⾛光了，3y终于可以⾛了");
            }
        }).start();
        // 其他员⼯线程启动
        for (int i = 0; i < 5; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("员⼯xxxx下班了");
                    countDownLatch.countDown();
                }
            }).start();
        }
    }
}